/*
 * TestBlockStorageStrategy.cpp
 *
 *  Created on: 29/10/2009
 *      Author: root
 */

#include <iostream>
#include "../Strategies/Storage/BlockStorageStrategy.h"
#include "../Model/ArchivoBinario.h"
#include "../Externa/Clave.h"
#include "../Externa/Dato.h"
#include "Alumno.h"
#include "../StorageResourceFactory.h"
#include "../Strategies/Resource/SimpleResourceStrategy.h"
#include "../Externa/Utilitaria.h"
#include "../Model/ArchivoBinario.h"
#include "../Model/Bloque.h"

class TestBlocksStorageStrategy {

private:

	StorageResourceFactory* factory;
	StorageResource* storageResource;
	BlockStorageStrategy* blockStorageStrategy;
	//Almacenamiento* almacenamiento;
	ArchivoBinario* archivoBinario;
	Alumno* alumno;
	Alumno* alumno2;
	Alumno* alumno3;
	Alumno* alumno4;
	Clave* clave;
	Bloque* bloque, *bloque2, *bloque3;
	ResourceStrategy * resourceStrategy;

public:

	void Setup() {

		alumno=new Alumno();
		alumno->setApellido("like");
		alumno->setDni("123");
		alumno->setNombre("ale");
		alumno->setPadron("85424");

		alumno2=new Alumno();
		alumno2->setApellido("arcia");
		alumno2->setDni("1234");
		alumno2->setNombre("benyi");
		alumno2->setPadron("85224");

		alumno3 = new Alumno();
		alumno3->setApellido("Like Ponce");
		alumno3->setDni("10607437");
		alumno3->setNombre("Carlos Alberto");
		alumno3->setPadron("88845");

		alumno4 = new Alumno();
		alumno4->setApellido("like garcia");
		alumno4->setDni("1000");
		alumno4->setNombre("alejandro");
		alumno4->setPadron("85424utuiuyttyuiytiuytyujjjjjjjjjjjhhhhhhhhhhhhhhhhjjjjjjjjjjjjjjjjj");


		string dato1=alumno->serializar();
		string dato2=alumno2->serializar();
		string dato3=alumno3->serializar();

		clave = new Clave("DNI",alumno);

		Registro registro(dato1,*clave);
		Registro registro2(dato2,*clave);
		Registro registro3(dato3,*clave);

					//polimirfismo
		bloque = new Bloque(0,255);
		bloque->getRegistros()->push_back(registro);
		bloque->getRegistros()->push_back(registro2);
		bloque->getRegistros()->push_back(registro);

		bloque2 = new Bloque(1,255);
		bloque2->getRegistros()->push_back(registro);
		bloque2->getRegistros()->push_back(registro3);

		bloque3 = new Bloque(2,255);
		bloque3->getRegistros()->push_back(registro2);
		bloque3->getRegistros()->push_back(registro3);

/*		factory = new StorageResourceFactory();
		factory->createStorageBlockResourceInFile();
		storageResource = factory->getStorageResource();*/

		archivoBinario = new ArchivoBinario("TestBlockStorageStrategy.txt", bloque->getTamanio());
		//int tamanioCritico = 0.8;
		blockStorageStrategy = new BlockStorageStrategy("TestBlockStorageStrategy.txt",bloque->getTamanio());
		resourceStrategy = new SimpleResourceStrategy (archivoBinario);
		blockStorageStrategy->setResourceStrategy(resourceStrategy);
		blockStorageStrategy->setStorage(archivoBinario);

		cout <<"setup terminado"<< endl;
	}

	void Terminar () {

		delete alumno;
		alumno = NULL;

		delete alumno2;
		alumno2 = NULL;

		delete alumno3;
		alumno3 = NULL;

		delete clave;
		clave = NULL;

		delete bloque;
		bloque = NULL;

		delete bloque2;
		bloque2 = NULL;

		delete bloque3;
		bloque3 = NULL;

		delete archivoBinario;
		archivoBinario = NULL;

		delete blockStorageStrategy;
		blockStorageStrategy = NULL;


		cout << "El test de BlockStorageStrategy se completo"<< endl;


	}

	void TestGrabarBloque () {
		cout<<"TestGrabarBloque"<<endl;
		this->blockStorageStrategy->GrabarBloque(*bloque);
		this->blockStorageStrategy->GrabarBloque(*bloque2);
		this->blockStorageStrategy->GrabarBloque(*bloque3);
		cout<<"bloques grabados"<<endl;
	}

	void TestLeerBloque () {
		cout<<"TestLeerBloque"<<endl;
		Bloque* bloq;
		bloq = blockStorageStrategy->LeerBloque(0);
		cout<< "nro y espaciolibre de bloq leido:  "<<bloq->getNroBloque()<<"  "<<bloq->getEspaciolibre()<<endl;
		delete bloq;


		bloq = blockStorageStrategy->LeerBloque(1);
		cout<< "nro y espaciolibre de bloq leido:  "<<bloq->getNroBloque()<<"  "<<bloq->getEspaciolibre()<<endl;
		delete bloq;

		bloq = blockStorageStrategy->LeerBloque(2);
		cout<< "nro y espaciolibre de bloq leido:  "<<bloq->getNroBloque()<<"  "<<bloq->getEspaciolibre()<<endl;
		delete bloq;
		bloq = NULL;

	}

	void TestSaveData () {
		cout<< "testSaveData"<<endl;
		Utilitaria util;
		string DNI, DNI2, DNI3;
		int nroBloque;
		int i;
		nroBloque=blockStorageStrategy->saveData(alumno2);
		cout<<"nroBloque donde se inserto el dato:  "<<nroBloque<<endl;
		nroBloque=blockStorageStrategy->saveData(alumno);
		cout<<"nroBloque donde se inserto el dato:  "<<nroBloque<<endl;
		nroBloque=blockStorageStrategy->saveData(alumno3);
		cout<<"nroBloque donde se inserto el dato:  "<<nroBloque<<endl;

		for(i=1000; i<1030; i=i+3) {
			DNI=util.IntToString(i);
			DNI2=util.IntToString(i+1);
			DNI3=util.IntToString(i+2);
			alumno2->setDni(DNI);
			alumno3->setDni(DNI2);
			alumno->setDni(DNI3);
			blockStorageStrategy->saveData(alumno2);
			blockStorageStrategy->saveData(alumno3);
			blockStorageStrategy->saveData(alumno);
		}

		//storageResource->setData(alumno);
	}

	void TestUpdateData () {
		cout<< "testUpdateData"<< endl;
		Utilitaria util;
		string DNI;
		//int i;
		alumno4->setDni("1003");
		blockStorageStrategy->updateData(alumno4,0);
		alumno4->setDni("1006");
		blockStorageStrategy->updateData(alumno4,1);




	}

	void TestDeleteData () {
		cout<<"TestDeleteDate"<<endl;
		Clave* clave3 = new Clave("asdf",alumno4);
		blockStorageStrategy->deleteData(clave3,0);
	}

	void Run () {
		Setup();
		//TestGrabarBloque();
		//TestLeerBloque();
		TestSaveData ();
		//TestDeleteData ();
		//TestUpdateData ();
		Terminar();
	}

};



